home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / modulesmc1 / stringf.e < prev    next >
Text File  |  1994-11-21  |  8KB  |  377 lines

  1. OPT MODULE
  2. SET PAD,LEFT,FIELD
  3.  
  4. EXPORT PROC stringf(str:PTR TO CHAR, format:PTR TO CHAR,
  5.             dataptr=NIL:PTR TO LONG)
  6. DEF tempstr[80]:ARRAY, left, right,
  7.     ch:REG, flag:REG, i:REG, j:REG, templen:REG
  8.  
  9.   MOVEM.L A2/A4/A6,-(A7)
  10.   MOVEA.L str,A4
  11.   MOVEA.L format,A6
  12. j20:   /* REPEAT */
  13.   MOVE.B (A6),(A4)+ /*   str[]++ := format[] */
  14. nextformat:
  15.   MOVEQ #0,flag
  16.   MOVE.L flag,i
  17.   MOVE.L i,right
  18.   MOVE.L i,left
  19.   MOVE.B (A6),ch     /*   ch:=format[]   */
  20.   CMPI.B #"%",ch     /*  IF ch="%" */
  21.   BNE.S endloop
  22. nextch:
  23.     ADDQ.W #1,i
  24.     MOVEA.L A6,A0    /*     ch:=format[i]   */
  25.     ADDA.W i,A0
  26.     MOVE.B (A0),ch
  27.     /*    SELECT    ch  */
  28.     CMPI.B #"l",ch   /* CASE "l" */
  29.     BNE.S j30
  30.       BRA gotlong
  31.     j30: CMPI.B #"s",ch   /* CASE "s" */
  32.     BNE.S j31
  33.       BRA.S gotstring
  34.     j31: CMPI.B #"-",ch    /* CASE "-" */
  35.     BNE.S j32
  36.       ORI.B #LEFT,flag    /*  flag:=flag OR LEFT    */
  37.       BRA.S nextch
  38.     j32: CMPI.B #"0",ch    /* CASE "0" */
  39.     BNE.S j29
  40.       ORI.B #PAD,flag    /*   flag:=flag OR PAD    */
  41.       BRA.S nextch
  42.     j29:  /* DEFAULT */
  43.     CMPI.B #"0",ch   /*  IF (ch>"0") AND (ch<="9") */
  44.     BLE.S j21
  45.     CMPI.B #"9",ch
  46.     BGT.S j21
  47.       ORI.B #FIELD,flag    /*    flag:=flag OR FIELD;  */
  48.       BRA field
  49.     j21:   /*  ELSE  */
  50.       MOVE.B (A6)+,(A4)+     /*  str[]++ := format[]++;  */
  51.       BRA.S nextformat
  52.     /*    ENDIF  */
  53.   /* ENDSELECT */
  54. endloop:   /*  ENDIF */
  55.   ADDQ.W #1,A6    /*  format++  */
  56.   MOVE.B -1(A4),j     /*  UNTIL str[-1]=0  */
  57.   BNE.S j20
  58.   MOVE.L A4,D1
  59.   SUB.L str,D1
  60.   SUBQ.L #1,D1     /* string length  */
  61.   MOVEA.L str,A0
  62.   CMP.W -4(A0),D1
  63.   BHI.S toolong
  64.   MOVE.W D1,-2(A0)
  65. toolong:
  66.   MOVE.L A0,D0
  67.   MOVEM.L (A7)+,A2/A4/A6
  68.   BRA endstringf
  69.  
  70. gotstring:
  71.   ADDA.W i,A6     /*  format:=format+i  */
  72.   SUBQ.W #1,A4     /* str-- */
  73.   MOVEA.L dataptr,A0     /* streamstring:=dataptr[]++ */
  74.   MOVEA.L (A0),A3
  75.   ADDQ.L #4,dataptr
  76.   BTST #2,flag /* IF flag AND  FIELD */
  77.   BEQ.S j15
  78.     MOVEA.L tempstr,A2         /*  savetempstr:=tempstr  */
  79.     MOVEQ #0,templen
  80.     j17:   /* REPEAT */
  81.     MOVE.B (A3)+,(A2)+ /* savetempstr[]++ := streamstring[]++ */
  82.     ADDQ.L #1,templen  /* templen++  */
  83.     MOVEQ #0,j
  84.     MOVE.B -1(A3),j   /*  UNTIL streamstring[-1]=0  */
  85.     BNE.S j17     /*  UNTIL j=0 */
  86.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  87.     SUBQ.L #1,templen
  88.     CMP.L right,templen  /*   IF templen>right THEN templen:=right  */
  89.     BLE.S j18
  90.     MOVE.L right,templen
  91.     j18:  BSR dopad
  92.     BRA.S j16
  93.  
  94.   j15:    /*  ELSE  */
  95.     j19:    /* REPEAT */
  96.       MOVE.B (A3)+,(A4)+  /* str[]++ := streamstring[]++ */
  97.       MOVE.B -1(A3),j   /* UNTIL streamstring[-1]=0 */
  98.       BNE.S j19   /* UNTIL j=0    */
  99.       SUBQ.L #1,A4  /* str-- */
  100.   j16:          /* ENDIF */
  101.   BRA.S endloop
  102.  
  103. gotlong:
  104.   ADDA.L i,A6  /*  format:=format+i+1    */
  105.   ADDQ.L #1,A6
  106.   SUBQ.L #1,A4    /* str-- */
  107.   MOVE.B (A6),ch   /* ch:=format[] */
  108.   /* SELECT ch    */
  109.   CMPI.B #"d",ch   /*CASE "d" */
  110.   BNE.S j25
  111.   MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  112.   MOVE.L (A0),D0
  113.   ADDQ.L  #4,dataptr
  114.   BTST #2,flag     /*  IF flag AND FIELD */
  115.   BEQ.S j5
  116.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  117.     MOVE.L A2,A0
  118.     BSR decimal
  119.     MOVE.L A0,D0
  120.     SUB.L A2,D0
  121.     MOVE.L D0,templen
  122.     BSR dopad
  123.     BRA.S j6
  124.  
  125.     /*      ELSE     */
  126.     j5:   MOVEA.L A4,A0  /* MOVE.L str,A0 */
  127.     BSR decimal
  128.     MOVEA.L A0,A4  /* MOVE.L A0,str  */
  129.     j6:   /*     ENDIF    */
  130.     BRA  j23
  131.  
  132.     j25:  /* CASE "x" */
  133.     CMPI.B #"x",ch
  134.     BNE.S j26
  135.       MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  136.       MOVE.L (A0),D0
  137.       ADDQ.L  #4,dataptr
  138.       BTST #2,flag  /* IF flag AND FIELD */
  139.       BEQ.S j7
  140.     MOVEA.L tempstr,A2 /*  savetempstr:=tempstr  */
  141.     MOVEA.L A2,A0  /* MOVEA.L savetempstr,A0 */
  142.     BSR hex
  143.     MOVE.L D0,templen
  144.     BSR.S dopad
  145.     BRA.S j8
  146.  
  147.       j7:  /*  ELSE  */
  148.     MOVEA.L A4,A0  /* MOVEA.L str,A0 */
  149.     BSR hex
  150.     MOVEA.L A0,A4  /*  MOVE.L A0,str  */
  151.       j8:     /*  ENDIF */
  152.       BRA.S j23
  153.  
  154.     j26:  /* CASE "c" */
  155.     CMPI.B #"c",ch
  156.     BNE.S j27
  157.       MOVEA.L dataptr,A0 /* str[]++:=dataptr[]++ */
  158.       ADDQ.L #4,dataptr
  159.       MOVE.B 3(A0),(A4)+    /* low byte of data  */
  160.       BRA.S j23
  161.  
  162.     j27:  /* CASE "b"; */
  163.     CMPI.B #"b",ch
  164.     BNE.S j24  /* default */
  165.       MOVEA.L dataptr,A0  /*   number:=dataptr[]++;  */
  166.       ADDQ.L  #4,dataptr
  167.       MOVE.L (A0),D0   /* sets flags for beq.s binzero  below */
  168.       MOVEA.L tempstr,A2
  169.       MOVEA.L A2,A0   /* MOVEA.L savetempstr,A0 */
  170.       BEQ.S binzero
  171.       MOVEQ #31,D1
  172.       next0:
  173.     BTST  D1,D0
  174.     DBNE D1,next0
  175.       nextbit:
  176.     BTST D1,D0
  177.     BEQ.S bit0
  178.     MOVE.B #"1",(A0)+
  179.     BRA.S bit1
  180.       bit0:
  181.     MOVE.B #"0",(A0)+
  182.       bit1:
  183.     DBRA D1,nextbit
  184.     BRA.S endbin
  185.       binzero:
  186.     MOVE.B #"0",(A0)+
  187.       endbin:
  188.     SUBA.L A2,A0  /* SUBA.L savetempstr,A0    */
  189.     MOVE.L A0,templen
  190.     BSR.S dopad
  191.     BRA.S j23
  192.  
  193.     j24: /* DEFAULT  */
  194.     /* str[]++ := "%"; str[]++ :="l"; str[]++ := ch  */
  195.     MOVE.W #"%l",(A4)+
  196.     MOVE.B ch,(A4)+
  197.   j23: /*ENDSELECT */
  198.   BRA endloop
  199.  
  200. dopad:
  201.   CMP.L left,templen          /*  IF templen>=left   */
  202.   BLT.S j13
  203.     MOVE.L templen,i
  204.     SUBQ.L #1,i
  205.     d1: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  206.     DBRA i,d1
  207.     BRA.S j14
  208.  
  209.   j13:          /* ELSE */
  210.   BTST #0,flag /* j:=IF flag AND PAD THEN "0" ELSE " "   j is pad char  */
  211.   BEQ.S j9
  212.     MOVEQ #"0",j
  213.     BRA.S j10
  214.     j9: MOVEQ #" ",j
  215.     j10:
  216.     BTST #1,flag    /*     IF flag AND LEFT  */
  217.     BEQ.S j11
  218.       MOVE.L templen,i
  219.       SUBQ.L #1,i
  220.       d2: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  221.       DBRA i,d2
  222.       MOVE.L left,i
  223.       SUB.L templen,i
  224.       SUBQ.L #1,i
  225.       d3:  MOVE.B j,(A4)+  /*  str[]++:=padch */
  226.     DBRA i,d3
  227.       BRA.S j12
  228.  
  229.     j11:     /* ELSE  */
  230.       MOVE.L left,i
  231.       SUB.L templen,i
  232.       SUBQ.L #1,i
  233.       d4:  MOVE.B j,(A4)+  /*  str[]++:=padch */
  234.     DBRA i,d4
  235.       MOVE.L templen,i
  236.       SUBQ.L #1,i
  237.       d5: MOVE.B (A2)+,(A4)+   /*  str[]++ := savetempstr[]++ */
  238.     DBRA i,d5
  239.     j12:      /* ENDIF */
  240.   j14:       /* ENDIF */
  241.   RTS
  242.  
  243. field:
  244.   ANDI.B #$F,ch     /*    left:=ch-"0" */
  245.   MOVE.L ch,j
  246.   j1: MOVEA.L A6,A3
  247.     ADDA.L i,A3
  248.     CMPI.B #".",1(A3)
  249.     BEQ.S j2
  250.     MOVE.B 1(A3),ch
  251.     ANDI.B #$F,ch
  252.     ADDQ.L #1,i
  253.     MULU #10,j      /*   left:=10*left+ch-"0"  */
  254.     ADD.L ch,j
  255.     BRA.S j1
  256.  
  257.   j2: MOVE.L j,left
  258.     ADDQ.L #2,i
  259.     MOVEA.L A6,A3
  260.     ADDA.L i,A3
  261.     MOVE.B (A3),ch
  262.     ANDI.B #$F,ch    /*   right:=ch-"0"    */
  263.     MOVE.B ch,j
  264.  
  265.   j3: MOVEA.L A6,A3
  266.     ADDA.L i,A3
  267.     CMPI.B #"0",1(A3)
  268.     BLT.S j4
  269.     CMPI.B #"9",1(A3)
  270.     BGT.S j4
  271.       ADDQ.W #1,A6
  272.       MOVEA.L A6,A3
  273.       ADDA.L i,A3
  274.       MOVE.B (A3),ch    /*   right:=10*right+ch-"0"  */
  275.       ANDI.B #$F,ch
  276.       MULU #10,j
  277.       ADD.L ch,j
  278.       BRA.S j3
  279.  
  280.   j4: MOVE.L j,right
  281.     BRA nextch
  282.  
  283. decimal:
  284.    SUBA.W  #14,A7
  285.    MOVEA.L A7,A3
  286.    MOVE.L D0,D2
  287.    BGE.S repeatbig
  288.    NEG.L D0
  289. repeatbig:
  290.    CMPI.L #655359,D0
  291.    BHI.S  bignumber
  292. repeat:
  293.    MOVEQ  #10,D1
  294.    CMP.L D1,D0
  295.    BHI.S norm
  296.    BEQ.S is1
  297.    MOVE.L D0,D1
  298.    MOVEQ  #0,D0
  299.    BRA.S cont
  300.  
  301. norm:
  302.    DIVU  D1,D0
  303.    SWAP  D0
  304.    CLR.L D1
  305.    MOVE.W D0,D1
  306.    CLR.W D0
  307.    SWAP  D0
  308. cont:
  309.    ADDI.B #"0",D1
  310.    MOVE.B D1,(A3)+
  311.    TST.L D0
  312.    BGT.S repeat
  313.    TST.L D2
  314.    BGE.S notneg
  315.    MOVE.B #"-",(A3)+
  316. notneg:
  317.    MOVE.B  -(A3),(A0)+
  318.    CMPA.L  A3,A7
  319.    BLT.S notneg
  320.    ADDA.W #14,A7
  321.    RTS
  322.  
  323. is1:
  324.    MOVEQ #1,D0
  325.    MOVEQ #0,D1
  326.    BRA.S cont
  327.  
  328. bignumber:
  329.    MOVEM.L D2/D3,-(A7)
  330.    MOVEQ #10,D1
  331.    MOVE.L D0,D2
  332.    CLR.W D2
  333.    SWAP D2
  334.    DIVU D1,D2
  335.    CLR.L D3
  336.    MOVE.W D2,D3
  337.    SWAP D3
  338.    MOVE.W D0,D2
  339.    DIVU D1,D2
  340.    MOVE.L D2,D1
  341.    CLR.W D1
  342.    SWAP D1
  343.    CLR.L D0
  344.    MOVE.W D2,D0
  345.    ADD.L D3,D0
  346.    ADD.B #"0",D1
  347.    MOVE.B D1,(A3)+
  348.    MOVEM.L (A7)+,D2/D3
  349.    BRA repeatbig
  350.  
  351. hex:
  352.   MOVEA.L A7,A3
  353.   SUBA.W  #14,A3
  354.   MOVEQ #-1,D2
  355.   nextltr:
  356.     MOVE.B D0,D1
  357.     ANDI.B #$0F,D1
  358.     ADDI.B #48,D1
  359.     CMPI.B #57,D1
  360.     BLE.S around
  361.       ADDQ.B #7,D1
  362.     around:
  363.     MOVE.B D1,(A3)+
  364.     LSR.L #4,D0
  365.     DBEQ D2,nextltr
  366.     NOT.L D2
  367.     MOVE.L D2,D0
  368.     ADDQ.L #1,D0
  369.     loadstr:
  370.       MOVE.B -(A3),(A0)+    /* reverse buffer  */
  371.       DBF D2,loadstr
  372.     RTS
  373.  
  374. endstringf:
  375. ENDPROC D0
  376.  
  377.